Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.11.2014, 00:08
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

Отправить массив клиенту в ответ на ajax
Всем привет! Помогите, не могу отправить массив клиенту.
Вот что есть:
1. аякс запрос к серверу:
function QueryItem(ip, code, Start, End) {
        content = $.ajax({
            url: '/result',
            type: 'get',
            data: ({IP: ip, CODE: code, START: Start, END: End}),
            success: function(msg) {
                SetTable(msg);
            }
        }).responseText;
        return;
    }

2. сервер запускает скульную функцию и результат отправляет клиенту:
GetData(res, params, function(rows){
        SendClient(res, rows);
    });

function GetData(res, params, callback) {
    var i = 0;
    var ip = params["p_IP"];
    var code = params["p_CODE"];
    var Start = params["p_START"];
    var End = params["p_END"];
    var tmpConnect = "Driver={SQL Server};Server=" + ip + ";Database=DB;UID=sa;PWD=pwd;";
    odbc.open(tmpConnect, function(err, tmpDB) {

        if (err) {
            return console.log("Error!\n" + err);
        }

        var SQL = "SELECT * FROM [dbo].[ufn_getJornalRealizNew]('" + Start + "', '" + End + "', '" + code + "')";

        tmpDB.query(SQL, function (err, rows, moreResultSets) {

            if (err) {
                return console.log('Error!\n' + err.message);
            }

            tmpDB.close();
            callback(String(rows)); //без явного приведения к строке не прокатывает
        });
    });
}

function SendClient(res, data) {
    res.end(data);
}

3. на клиенте хочется работать уже с массивом, а не со строкой.
понятное дело, что для строки такое не выполнится:
function SetTable(data) {
        alert(data[1].FIO); //undefined
        return;
}

а теперь вопрос: как передать клиенту массив, может заголовки какие надо отправить?
Или вообще в каком-то другом формате отправлять?
При попытке вызвать колбэк из ф-и GetData на сервере вот так:
callback(rows);

вместо
callback(String(rows));

получаю ошибку:
Код:
TypeError: first argument must be a string or Buffer
               at SendClient (c:\www\reports\routes\realiz.js:252:9)
При выводе результатов скульного запроса через console.log, вижу массив объектов, например:
[
{ k_rec: 126768,
FIO: 'ИВАНОВ ИВАН ИВАНОВИЧ',
RequestNo: '12/1-3000/14',
EST_GUID: 'C0DE6E44-C8B8-41AC-BB4B-75F329E318B9',
CostEst: 924,
NdsEst: 166.32,
TotalEst: 1090.32 },
{ k_rec: 126769,
FIO: 'СИДОРОВ СИДР СИДОРОВИЧ',
RequestNo: '12/1-3001/14',
EST_GUID: 'C0DE6E44-C8B8-41AC-BB4B-7535TR8I318B9',
CostEst: 385.26,
NdsEst: 45.62,
TotalEst: 420.88 }
]
Ответить с цитированием
  #2 (permalink)  
Старый 27.11.2014, 10:06
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

в общем решил передавать клиенту json строку, соответственно полученный от сервера массив объектов сериализовать в json.
пытаюсь сделать так:
function SerializeToJSON(data, callback) {
    var i = 0;
    var jsonData;
    while (i < data.length) {
        var str = JSON.stringify(data[i]);
        jsonData += str;
        i ++;
    }
    callback(jsonData);
}

в data пихаю полученные данные от скуль-сервера в виде:
Код:
[
{ k_rec: 126768,
FIO: 'ИВАНОВ ИВАН ИВАНОВИЧ',
RequestNo: '12/1-3000/14',
EST_GUID: 'C0DE6E44-C8B8-41AC-BB4B-75F329E318B9',
CostEst: 924,
NdsEst: 166.32,
TotalEst: 1090.32 },
{ k_rec: 126769,
FIO: 'СИДОРОВ СИДР СИДОРОВИЧ',
RequestNo: '12/1-3001/14',
EST_GUID: 'C0DE6E44-C8B8-41AC-BB4B-7535TR8I318B9',
CostEst: 385.26,
NdsEst: 45.62,
TotalEst: 420.88 }
]
но не получается привести к json, почему?
может потому что в объектах массива есть ключи со значениями заключенными в одинарные кавычки, например:
FIO: 'ИВАНОВ ИВАН ИВАНОВИЧ'
как сериализовать эти данные?
Ответить с цитированием
  #3 (permalink)  
Старый 27.11.2014, 10:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ascherbakov
как сериализовать эти данные?
JSON.stringify(data)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 27.11.2014, 10:58
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

я идиот! )))
Забыл убрать приведение к String, при вызове колбэка
callback(String(rows))
после первого неудачного эксперимента, который в первом посте описывал)
Ответить с цитированием
  #5 (permalink)  
Старый 27.11.2014, 13:04
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

чтобы не плодить темы, спрошу здесь.
ф-я GetData, (её код выше) возвращает слишком большой набор данных.
данные-то вроде как клиенту в итоге отправляются, но похоже не доходят до него...
попытка вывести их в консоль на клиенте не дает никаких результатов.
как можно решить проблему?
Ответить с цитированием
  #6 (permalink)  
Старый 27.11.2014, 13:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ascherbakov
слишком большой набор данных
Насколько большой? Число элементов и размер в json строки.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 27.11.2014, 13:36
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

скуль возвращает 3839 записей, каждая из 20 полей
тип и размер полей разный, самое большое поле - строковое, 255 символов.
соответственно в json строке будем иметь 3839 объектов по 20 пар ключ:значение в каждом
в итоге длина строки json - 1968010 символов.
запрос к скулю выполняется более 2 минут.
само приложение - генератор отчетов, в зависимости указанного пользователем от отчетного периода меняется время выполнения и размер результата скуль-запроса. Если пользователь захочет посмотреть данные за год, соответственно время и размер вырастут.
Ответить с цитированием
  #8 (permalink)  
Старый 27.11.2014, 14:06
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

есть какое-то ограничение по количеству символов или объему памяти, свыше которого сервер не может передать клиенту?
есть конечно вариант разбить отчетный период например по месяцам и запускать несколько запросов к базе и отправлять клиенту эти данные пачками, но тогда встает вопрос как аккумулировать эти данные на клиенте, для последующей генерации таблицы...
может у кого есть какие-то предложения?
Ответить с цитированием
  #9 (permalink)  
Старый 27.11.2014, 15:06
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Видимо у тебя выходит таймаут ajax-запроса. Выставь таймаут побольше.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 27.11.2014, 15:45
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

неа! поставил timeout: 600000
все равно ничего не пришло, даже:
success: function(msg) {
alert("Ответ от сервера получен!");
}
не выполняется... куда еще копнуть?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправить, когда четко соберется массив vas88811 Events/DOM/Window 11 26.02.2014 21:55
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Через ajax отправить много данных из таблицы на сервер Heger jQuery 3 29.08.2012 18:51
Ответ конкретному клиенту fredwriter AJAX и COMET 2 18.04.2012 13:28
Ajax - JSON - не распознает пришедший ответ Майский Кот jQuery 1 14.05.2009 00:40